package py.com.alfa.escriba.web.services.impl;

import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.DuplicateKeyException;

import java.util.List;

import py.com.alfa.escriba.exception.ErrorCode;
import py.com.alfa.escriba.exception.ServiceException;
import py.com.alfa.escriba.persistence.dao.InmuebleslinderosDAO;
import py.com.alfa.escriba.persistence.dto.InmuebleslinderosDTO;
import py.com.alfa.escriba.util.Utils;
import py.com.alfa.escriba.web.interceptor.InvocationContext;
import py.com.alfa.escriba.web.services.InmuebleslinderosService;

public class InmuebleslinderosServiceImpl implements InmuebleslinderosService{

  private InmuebleslinderosDAO inmuebleslinderosDAO;

  public void setInmuebleslinderosDAO(InmuebleslinderosDAO inmuebleslinderosDAO) {
    this.inmuebleslinderosDAO = inmuebleslinderosDAO;
  }

  @Override
  public List<InmuebleslinderosDTO> listInmuebleslinderos(InvocationContext ic) throws ServiceException {
    List<InmuebleslinderosDTO> inmuebleslindeross =  inmuebleslinderosDAO.listInmuebleslinderos();

    return inmuebleslindeross;
  }

  @Override
  public InmuebleslinderosDTO getInmuebleslinderos(Long id, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    InmuebleslinderosDTO inmuebleslinderos =  inmuebleslinderosDAO.getInmuebleslinderosById(id);

    if (inmuebleslinderos == null)
      throw new ServiceException(ErrorCode.NO_DATA_FOUND,"inmuebleslinderos.notfound", id);

    return inmuebleslinderos;
  }

  @Override
  public void deleteInmuebleslinderos(Long id, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    InmuebleslinderosDTO inmuebleslinderos =  inmuebleslinderosDAO.getInmuebleslinderosById(id);

    if(inmuebleslinderos == null)
      throw new ServiceException(ErrorCode.NO_DATA_FOUND,"inmuebleslinderos.notfound", id);

    try {
      inmuebleslinderosDAO.deleteInmuebleslinderos(inmuebleslinderos);
    }
    catch (DataIntegrityViolationException e){
      throw new ServiceException(ErrorCode.DATA_INTEGRITY_VIOLATION, "inmuebleslinderos.constraint.violation", id);
    }

  }

  @Override
  public InmuebleslinderosDTO updateInmuebleslinderos(Long id, InmuebleslinderosDTO dto, InvocationContext ic) throws ServiceException {
    if (id == null || id <= 0)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","id");

    if (null == dto)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","dto");

    InmuebleslinderosDTO inmuebleslinderos = inmuebleslinderosDAO.getInmuebleslinderosById(id);

    if (inmuebleslinderos == null)
      throw new ServiceException(ErrorCode.NO_DATA_FOUND,"inmuebleslinderos.notfound", id);

    inmuebleslinderos.setIdinmueble(dto.getIdinmueble());
    inmuebleslinderos.setOrden(dto.getOrden());
    inmuebleslinderos.setLadonombre(dto.getLadonombre());
    inmuebleslinderos.setLadomedida(dto.getLadomedida());
    inmuebleslinderos.setIdunidadmedida(dto.getIdunidadmedida());
    inmuebleslinderos.setLadolinda(dto.getLadolinda());
 

    Utils.validarDTO(dto);

    inmuebleslinderosDAO.updateInmuebleslinderos(dto);

    return inmuebleslinderos;
  }

  @Override
  public InmuebleslinderosDTO createInmuebleslinderos(InmuebleslinderosDTO dto, InvocationContext ic) throws ServiceException {
    if (dto == null)
      throw new ServiceException(ErrorCode.PARAMETER_ERROR,"parameter.error.null","dto");

    try {

      Utils.validarDTO(dto);

      inmuebleslinderosDAO.createInmuebleslinderos(dto);
    }
    catch (DuplicateKeyException e){
      throw new ServiceException(ErrorCode.DUPLICATE_KEY_EXCEPTION, "inmuebleslinderos.duplicate.key");
    }

    return dto;
  }

}